home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / ZSI / twisted / WSresource.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  11KB  |  312 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import sys
  5. import warnings
  6. from zope.interface import classProvides, implements, Interface
  7. from twisted.python import log, failure
  8. from twisted.web.error import NoResource
  9. from twisted.web.server import NOT_DONE_YET
  10. import twisted.web.http as twisted
  11. import twisted.web.resource as twisted
  12. from ZSI import _get_element_nsuri_name, EvaluateException, ParseException
  13. from ZSI.parse import ParsedSoap
  14. from ZSI.writer import SoapWriter
  15. from ZSI import fault
  16. from ZSI.address import Address
  17. from ZSI.ServiceContainer import WSActionException
  18. from interfaces import CheckInputArgs, HandlerChainInterface, CallbackChainInterface, DataHandler
  19.  
  20. class LoggingHandlerChain:
  21.     
  22.     def __init__(self, cb, *handlers):
  23.         self.handlercb = cb
  24.         self.handlers = handlers
  25.         self.debug = len(log.theLogPublisher.observers) > 0
  26.  
  27.     __init__ = CheckInputArgs(CallbackChainInterface, HandlerChainInterface)(__init__)
  28.     
  29.     def processRequest(self, arg, **kw):
  30.         debug = self.debug
  31.         if debug:
  32.             log.msg('--->PROCESS REQUEST: %s' % arg, debug = 1)
  33.         
  34.         for h in self.handlers:
  35.             if debug:
  36.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  37.             
  38.             arg = h.processRequest(arg, **kw)
  39.         
  40.         return self.handlercb.processRequest(arg, **kw)
  41.  
  42.     
  43.     def processResponse(self, arg, **kw):
  44.         debug = self.debug
  45.         if debug:
  46.             log.msg('===>PROCESS RESPONSE: %s' % str(arg), debug = 1)
  47.         
  48.         if arg is None:
  49.             return None
  50.         
  51.         for h in self.handlers:
  52.             if debug:
  53.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  54.             
  55.             arg = h.processResponse(arg, **kw)
  56.         
  57.         s = str(arg)
  58.         if debug:
  59.             log.msg(s, debug = 1)
  60.         
  61.         return s
  62.  
  63.  
  64.  
  65. class DefaultCallbackHandler:
  66.     classProvides(CallbackChainInterface)
  67.     
  68.     def processRequest(cls, ps, **kw):
  69.         resource = kw['resource']
  70.         request = kw['request']
  71.         method = getattr(resource, 'soap_%s' % _get_element_nsuri_name(ps.body_root)[-1])
  72.         
  73.         try:
  74.             (req_pyobj, rsp_pyobj) = method(ps, request = request)
  75.         except TypeError:
  76.             ex = None
  77.             log.err('ERROR: service %s is broken, method MUST return request, response' % cls.__name__)
  78.             raise 
  79.         except Exception:
  80.             ex = None
  81.             log.err('failure when calling bound method')
  82.             raise 
  83.  
  84.         return rsp_pyobj
  85.  
  86.     processRequest = classmethod(processRequest)
  87.  
  88.  
  89. class WSAddressHandler:
  90.     implements(HandlerChainInterface)
  91.     
  92.     def processRequest(self, ps, **kw):
  93.         resource = kw['resource']
  94.         d = getattr(resource, 'root', None)
  95.         key = _get_element_nsuri_name(ps.body_root)
  96.         if d is None or d.has_key(key) is False:
  97.             raise RuntimeError, 'Error looking for key(%s) in root dictionary(%s)' % (key, str(d))
  98.         
  99.         self.op_name = d[key]
  100.         self.address = address = Address()
  101.         address.parse(ps)
  102.         action = address.getAction()
  103.         if not action:
  104.             raise WSActionException('No WS-Action specified in Request')
  105.         
  106.         request = kw['request']
  107.         http_headers = request.getAllHeaders()
  108.         soap_action = http_headers.get('soapaction')
  109.         if soap_action and soap_action.strip('\'"') != action:
  110.             raise WSActionException('SOAP Action("%s") must match WS-Action("%s") if specified.' % (soap_action, action))
  111.         
  112.         ps.address = address
  113.         return ps
  114.  
  115.     
  116.     def processResponse(self, sw, **kw):
  117.         if sw is None:
  118.             self.address = None
  119.             return None
  120.         
  121.         request = kw['request']
  122.         resource = kw['resource']
  123.         if isinstance(request, twisted.web.http.Request) is False:
  124.             raise TypeError, '%s instance expected' % http.Request
  125.         
  126.         d = getattr(resource, 'wsAction', None)
  127.         key = self.op_name
  128.         if d is None or d.has_key(key) is False:
  129.             raise WSActionNotSpecified, 'Error looking for key(%s) in wsAction dictionary(%s)' % (key, str(d))
  130.         
  131.         addressRsp = Address(action = d[key])
  132.         if request.transport.TLS == 0:
  133.             addressRsp.setResponseFromWSAddress(self.address, 'http://%s:%d%s' % (request.host.host, request.host.port, request.path))
  134.         else:
  135.             addressRsp.setResponseFromWSAddress(self.address, 'https://%s:%d%s' % (request.host.host, request.host.port, request.path))
  136.         addressRsp.serialize(sw, typed = False)
  137.         self.address = None
  138.         return sw
  139.  
  140.  
  141.  
  142. class WSAddressCallbackHandler:
  143.     classProvides(CallbackChainInterface)
  144.     
  145.     def processRequest(cls, ps, **kw):
  146.         resource = kw['resource']
  147.         request = kw['request']
  148.         method = getattr(resource, 'wsa_%s' % _get_element_nsuri_name(ps.body_root)[-1])
  149.         
  150.         try:
  151.             (req_pyobj, rsp_pyobj) = method(ps, ps.address, request = request)
  152.         except TypeError:
  153.             ex = None
  154.             log.err('ERROR: service %s is broken, method MUST return request, response' % self.__class__.__name__)
  155.             raise 
  156.         except Exception:
  157.             ex = None
  158.             log.err('failure when calling bound method')
  159.             raise 
  160.  
  161.         return rsp_pyobj
  162.  
  163.     processRequest = classmethod(processRequest)
  164.  
  165.  
  166. class DeferHandlerChain:
  167.     
  168.     def __init__(self, cb, *handlers):
  169.         self.handlercb = cb
  170.         self.handlers = handlers
  171.         self.debug = len(log.theLogPublisher.observers) > 0
  172.  
  173.     __init__ = CheckInputArgs(CallbackChainInterface, HandlerChainInterface)(__init__)
  174.     
  175.     def processRequest(self, arg, **kw):
  176.         reactor = reactor
  177.         import twisted.internet
  178.         Deferred = Deferred
  179.         import twisted.internet.defer
  180.         debug = self.debug
  181.         if debug:
  182.             log.msg('--->DEFER PROCESS REQUEST: %s' % arg, debug = 1)
  183.         
  184.         d = Deferred()
  185.         for h in self.handlers:
  186.             if debug:
  187.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  188.                 log.msg('\thandler callback: %s' % h.processRequest)
  189.             
  190.             d.addCallback(h.processRequest, **kw)
  191.         
  192.         d.addCallback(self.handlercb.processRequest, **kw)
  193.         reactor.callLater(0.0001, d.callback, arg)
  194.         if debug:
  195.             log.msg('===>DEFER PROCESS RESPONSE: %s' % str(arg), debug = 1)
  196.         
  197.         for h in self.handlers:
  198.             if debug:
  199.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  200.             
  201.             d.addCallback(h.processResponse, **kw)
  202.         
  203.         d.addCallback(str)
  204.         return d
  205.  
  206.     
  207.     def processResponse(self, arg, **kw):
  208.         return arg
  209.  
  210.  
  211.  
  212. class DefaultHandlerChainFactory:
  213.     protocol = LoggingHandlerChain
  214.     
  215.     def newInstance(cls):
  216.         return cls.protocol(DefaultCallbackHandler, DataHandler)
  217.  
  218.     newInstance = classmethod(newInstance)
  219.  
  220.  
  221. class WSAddressHandlerChainFactory:
  222.     protocol = DefaultHandlerChain
  223.     
  224.     def newInstance(cls):
  225.         return cls.protocol(WSAddressCallbackHandler, DataHandler, WSAddressHandler())
  226.  
  227.     newInstance = classmethod(newInstance)
  228.  
  229.  
  230. class WSResource(twisted.web.resource.Resource, object):
  231.     encoding = 'UTF-8'
  232.     factory = DefaultHandlerChainFactory
  233.     
  234.     def __init__(self):
  235.         twisted.web.resource.Resource.__init__(self)
  236.  
  237.     
  238.     def _writeResponse(self, response, request, status = 200):
  239.         request.setResponseCode(status)
  240.         if self.encoding is not None:
  241.             mimeType = 'text/xml; charset="%s"' % self.encoding
  242.         else:
  243.             mimeType = 'text/xml'
  244.         request.setHeader('Content-Type', mimeType)
  245.         request.setHeader('Content-Length', str(len(response)))
  246.         request.write(response)
  247.         request.finish()
  248.  
  249.     
  250.     def _writeFault(self, fail, request):
  251.         response = fault.FaultFromException(fail.value, False, fail.tb).AsSOAP()
  252.         self._writeResponse(response, request, status = 500)
  253.  
  254.     
  255.     def render_POST(self, request):
  256.         maybeDeferred = maybeDeferred
  257.         import twisted.internet.defer
  258.         chain = self.factory.newInstance()
  259.         data = request.content.read()
  260.         d = maybeDeferred(chain.processRequest, data, request = request, resource = self)
  261.         d.addCallback(chain.processResponse, request = request, resource = self)
  262.         d.addCallback(self._writeResponse, request)
  263.         d.addErrback(self._writeFault, request)
  264.         return NOT_DONE_YET
  265.  
  266.  
  267.  
  268. class DefaultHandlerChain:
  269.     
  270.     def __init__(self, cb, *handlers):
  271.         self.handlercb = cb
  272.         self.handlers = handlers
  273.         self.debug = len(log.theLogPublisher.observers) > 0
  274.  
  275.     __init__ = CheckInputArgs(CallbackChainInterface, HandlerChainInterface)(__init__)
  276.     
  277.     def processRequest(self, arg, **kw):
  278.         debug = self.debug
  279.         if debug:
  280.             log.msg('--->PROCESS REQUEST: %s' % arg, debug = 1)
  281.         
  282.         for h in self.handlers:
  283.             if debug:
  284.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  285.             
  286.             arg = h.processRequest(arg, **kw)
  287.         
  288.         return self.handlercb.processRequest(arg, **kw)
  289.  
  290.     
  291.     def processResponse(self, arg, **kw):
  292.         debug = self.debug
  293.         if debug:
  294.             log.msg('===>PROCESS RESPONSE: %s' % str(arg), debug = 1)
  295.         
  296.         if arg is None:
  297.             return None
  298.         
  299.         for h in self.handlers:
  300.             if debug:
  301.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  302.             
  303.             arg = h.processResponse(arg, **kw)
  304.         
  305.         s = str(arg)
  306.         if debug:
  307.             log.msg(s, debug = 1)
  308.         
  309.         return s
  310.  
  311.  
  312.